package com.ego.commons.utils;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Date;

public class FastDFSClient {

    //配置文件路径
    //private static final String CONFIG_FILE_PATH = Thread.currentThread().getContextClassLoader().getResource("").getPath()+"client.conf";


    private static final String CONFIG_FILE_PATH = "client.conf";


    private static StorageClient storageClient;

    static {

        try {
            //读取配置文件，初始化操作
            ClientGlobal.init(CONFIG_FILE_PATH);

            //获取组
            TrackerGroup trackerGroup = ClientGlobal.getG_tracker_group();

            //创建TrackerClient对象
            TrackerClient trackerClient = new TrackerClient(trackerGroup);

            //获取TrackerServer 服务对象
            TrackerServer trackerServer = trackerClient.getConnection();

            //获取StorageServer 服务对象
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);


            //创建StroageClient对象: 所有的文件增删（下载）都是使用此对象操作
            storageClient = new StorageClient(trackerServer, storeStorage);
            System.out.println("storageClient = " + storageClient);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
    * storageClient.public String[] upload_file(byte[] file_buff,, String file_ext_name, NameValuePair[] meta_list)
     *  byte[] file_buff : 文件，可以通过InputStream 输入流转换成字节
     *  String file_ext_name ： 文件后缀
     *  NameValuePair[] meta_list ： 文件描述信息
     *     如： 长度，名称，作者等等
    * */

    /**
     * 文件上传工具方法
     * @param filename 文件名
     * @param inputStream 文件输入流
     * @return 上传结果 ["group1","M00/00/00/wKh-FGAt4muAO-1HAAItIjfWc9U485.jpg"]
     */
    public static String[] uploadFile(String filename, InputStream inputStream){

        try {
            //获取输入流大小
            int available = inputStream.available();

            byte[] buffer = new byte[available];
            //将输入数据读取到字节数组中
            inputStream.read(buffer);

            //创建文件描述信息,描述信息根据情况可以随意写，文件大小，文件名称，作者

            NameValuePair[] metaData = new NameValuePair[3];

            NameValuePair nameValuePair1 = new NameValuePair("length",available+"");
            NameValuePair nameValuePair2 = new NameValuePair("filename",filename);
            NameValuePair nameValuePair4 = new NameValuePair("updateDate",new Date().toString());

            metaData[0] = nameValuePair1;
            metaData[1] = nameValuePair2;
            metaData[2] = nameValuePair4;


            //上传文件
            String[] result = storageClient.upload_file(buffer, getExtension(filename), metaData);

            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }

    /**
     * 获取文件的描述信息
     * @param group_name 组名
     * @param remote_name 文件名
     * @return 描述对象数组
     */
    public static NameValuePair[] getMetaData(String group_name,String remote_name){

        try {
            NameValuePair[] metadata = storageClient.get_metadata(group_name, remote_name);
            return metadata;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取文件后缀
     * @param filename
     * @return
     */
    public static String getExtension(String filename){
        if(StringUtils.isNotBlank(filename) && filename.contains(".")){

            String extension = FilenameUtils.getExtension(filename);

            return extension;
        }
        return null;
    }

    /**
     *
     * ["group1","M00/00/00/wKh-FGAt4muAO-1HAAItIjfWc9U485.jpg"]
     *    组名      远程服务名称
     *   public int delete_file(String group_name, String remote_filename)
     *   group_name ：文件组名，默认就是 group1
     *   remote_filename ：fastdfs的远程文件名称
     */
    /**
     * 删除文件
     * @param group_name 组名  默认 group1
     * @param remote_filename 远程服务名称  M00/00/00/wKh-FGAt4muAO-1HAAItIjfWc9U485.jpg
     * @return 删除文件0 表示成功，非0表示失败
     */
    public static int deleteFile(String group_name,String remote_filename){

        if(StringUtils.isNotBlank(remote_filename)){
            try {
                //删除文件0 表示成功，非0表示失败
                int result = storageClient.delete_file(group_name == null ? "group1" : group_name, remote_filename);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return 0;
    }


    /**
     * 修改文件
     * 思路
     *  先新增，再删除旧文件
     * @param oldGoupname 旧文件组名
     * @param oldRemotename 旧文件名称
     * @param newFilename 新文件名称
     * @param inputStream 新文件字节流
     * @return
     */
    public static String[] upldateFile(String oldGoupname,String oldRemotename,String newFilename,InputStream inputStream){
        //新增文件
        String[] result = uploadFile(newFilename, inputStream);

        //删除文件
        int result1 = deleteFile(oldGoupname, oldRemotename);
        if(result1 != 0){
            return null;
        }

        return result;
    }

    /**
     * 下载文件
     * 通过组名和文件名 从fastdfs下载下载形成一个输入流（文件）
     * @param group_name 组名
     * @param remote_filename 文件名
     * @return 文件内容对应的输入流
     */
    public static InputStream downloadFile(String group_name,String remote_filename){

        try {
            //调用fastdfs api 读取对应文件的字节数组
            byte[] bytes = storageClient.download_file(group_name, remote_filename);

            //将字节数组转换成输入流
            InputStream byteArrayInputStream = new ByteArrayInputStream(bytes);

            return byteArrayInputStream;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}
